#include "hashFunc.h"
//通常输入关键字是字符串，在这种情况下，散列函数需要仔细地选择
//1、把字符串中字符的ASCII码值加起来
//这种方法非常简单，但是如果表很大，则函数不能很好的分配关键字。因为当关键字长度比较小时，会导致处于表下方的表项无法得到访问
/*
Index Hash(const char *Key, int TableSize)
{
    unsigned int HashVal = 0;
    while (*Key != '\0')
    {
        HashVal += *(Key++);
    }

    return HashVal % TableSize;
}
*/
//2、假设Key至少有两个字符外加一个'\0'结束符
//缺点是只能接受至少两个字符的字符串，并且事实上现实情况中3个字母的不同组合只有2851种
/*
Index Hash(const char *Key, int TableSize)
{
    return (Key[0] + 27 * Key[1] + 729 * Key[2]) % TableSize;
}
*/

//3、根据Horner法则计算一个32的多项式法则。我们之所以使用32代替27，是因为用32作乘法不是真的去乘而是移动二进制的5位，为了加速，在程序的第
//2行的加法可以用按位异或来代替。
//如果关键字很长，计算时间将会花费很长的时间，并且前面的字符还会左移出最终的结果。
//在这种情况下，通常的做法是不使用所有的字符，这里想法是计算散列函数节省下的时间补偿由此产生的对均匀分布的函数的轻微干扰
Index Hash(const char *Key, int TableSize)
{
    unsigned int HashVal = 0;
    while (*Key != '\0')
    {
        HashVal = (HashVal << 5) ^ (*Key++);
    }
    return HashVal & TableSize;
}